// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "GameFramework/HUD.h"
#include "UI/WidgetController/AuraWidgetController.h"
#include "AuraHUD.generated.h"

class UAttributeMenuWidgetController;
class UAuraUserWidget;
class UAttributeSet;
class UAbilitySystemComponent;
struct FWidgetControllerProps;
class UOverlayWidgetController;
/**
 * HUD用于管理UI 控件和控件控制器 等
 */
UCLASS()
class AURA_API AAuraHUD : public AHUD 
{
	GENERATED_BODY()

public:
	
	/** Get获取单例: 生命周期受控,确保这个对象的生命周期与 HUD 的生命周期一致，并且每次访问时都能安全地获取它。 */
	
	/**  获取Overlay控制器实例单例,没有就创建 */
	UOverlayWidgetController* GetOverlayWidgetController(const FWidgetControllerProps& WCProps);
	
	/**  获取AttributeMenu控制器实例单例,没有就创建 */
	UAttributeMenuWidgetController* GetAttributeMenuWidgetController(const FWidgetControllerProps& WCProps);

	/** 初始化HUD,即初始化 控件和控件控制器 */
	void InitOverlay(APlayerController* PC, APlayerState* PS, UAbilitySystemComponent* ASC, UAttributeSet* AS);

	
protected:
	
	virtual void BeginPlay() override;

	
private:
	
	// ----------------------------------------------------------------------------------------------------------------
	//	控件相关
	// ----------------------------------------------------------------------------------------------------------------

	/** Overlay控件 */
	UPROPERTY()
	TObjectPtr<UAuraUserWidget> OverlayWidget; 
	UPROPERTY(EditAnywhere)
	TSubclassOf<UAuraUserWidget> OverlayWidgetClass;

	/** Overlay控制器 */
	UPROPERTY()
	TObjectPtr<UOverlayWidgetController> OverlayWidgetController; 
	UPROPERTY(EditAnywhere)
	TSubclassOf<UOverlayWidgetController> OverlayWidgetControllerBPClass;

	/** 属性菜单控制器 */
	UPROPERTY()
	TObjectPtr<UAttributeMenuWidgetController> AttributeMenuWidgetController;
	UPROPERTY(EditAnywhere)
	TSubclassOf<UAttributeMenuWidgetController> AttributeMenuWidgetControllerClass;
};
